﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using _XNA__RunningDeath.GLO;
namespace _XNA__RunningDeath.GUI
{
    class CGUI_Setting:CDiaLogBox
    {
        #region contractor
        Texture2D _texBackgroundSetting;
        Texture2D _texBtnSelectMusic;
        Texture2D _texBtnSelectSound;
        Texture2D _texBtnSave;
        Texture2D _texBtnBack;

        Rectangle recSound;
        Rectangle recMusic;// Toa do cua Sound Item
        bool isSoundDrag;           // Co kiem tra keo tha
        bool isMusicDrag;           // Co kiem tra keo tha
        #endregion

        public CGUI_Setting(ContentManager content,GameTime gameTime,SpriteBatch spriteBatch):base(content,gameTime,spriteBatch)
        {
            if(this._content!=null)
            {
                this._texBackgroundSetting = this._content.Load<Texture2D>(@"GUI/bgSetting");
                this._texBtnSelectMusic = this._content.Load<Texture2D>(@"GUI/btnSelectMusic");
                this._texBtnSelectSound = this._content.Load<Texture2D>(@"GUI/btnSelectSound");
                this._texBtnBack = this._content.Load<Texture2D>(@"GUI/btnBack");
                this._texBtnSave = this._content.Load<Texture2D>(@"GUI/btnSave");
                this._texBG = this._content.Load<Texture2D>(@"GUI/guiBG");
                this._dstoado = this._content.Load<Dictionary<string, Rectangle>>(@"GUI/ztoadoXMLgui");
                recMusic = this._dstoado["btnSelecMusic"];
                recSound = this._dstoado["btnSelectSound"];  // Thiet lap toa do cho Sound Item dua tren danh sach toa do trong XML
                isSoundDrag = false;
                isMusicDrag = false;

                getPosALMusic(CThamSo.volumMusic);
                getPosALSound(CThamSo.volumSound);
            }
        }
        public override void Update(GameTime gameTime)
        {
            CGLOBAL.MousePrev = CGLOBAL.MouseCurrent;   //lưu trạng thái chuột vừa click
            CGLOBAL.MouseCurrent = Mouse.GetState();    // Lấy trạng thái chuột mới

            if (CGLOBAL.MouseCurrent.LeftButton == ButtonState.Pressed && CGLOBAL.MousePrev.LeftButton == ButtonState.Released)//double click
            {
                if (this._dstoado["btnBackSetting"].Contains(new Point(CGLOBAL.MouseCurrent.X, CGLOBAL.MouseCurrent.Y)))  // Contains = chứa cái gì
                {
                    CGLOBAL.soundFXbtn.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
                    CGLOBAL.NextGUI = true; 
                    CGLOBAL.GUISelected = CGLOBAL.GUISelectedPrev;
                }
                else if (this._dstoado["btnSaveSetting"].Contains(new Point(CGLOBAL.MouseCurrent.X, CGLOBAL.MouseCurrent.Y)))  
                {
                    CGLOBAL.soundFXbtn.Play(CThamSo.volumSound, CThamSo.pitchSound, CThamSo.panSound);
                    CGLOBAL.NextGUI = true;
                    CGLOBAL.GUISelected = GUIenum.guiMainMenu;
                }
                else if (recSound.Contains(new Point(CGLOBAL.MouseCurrent.X, CGLOBAL.MouseCurrent.Y)))  
                {
                    isMusicDrag = false;
                    isSoundDrag = true;
                }
                else if (recMusic.Contains(new Point(CGLOBAL.MouseCurrent.X, CGLOBAL.MouseCurrent.Y)))
                {
                    isMusicDrag = true;
                }
            }

            if (isMusicDrag == true && CGLOBAL.MouseCurrent.LeftButton == ButtonState.Pressed)
            {
                DrapMoveMusic();
            }
            else if (isSoundDrag == true && CGLOBAL.MouseCurrent.LeftButton == ButtonState.Pressed)
            {
                DrapMoveSound();
            }
            else
            {
                isSoundDrag = false;
                isMusicDrag = false;
            }
        }

        public override void Draw(GameTime gameTime)
        {
            this._spriteBatch.Begin();
            this._spriteBatch.Draw(this._texBG, Vector2.Zero, Color.Gray);
            this._spriteBatch.Draw(this._texBackgroundSetting, new Vector2(this._dstoado["bgSetting"].X, this._dstoado["bgSetting"].Y), Color.White);
            this._spriteBatch.Draw(this._texBtnBack, new Vector2(this._dstoado["btnBackSetting"].X, this._dstoado["btnBackSetting"].Y), Color.White);
            this._spriteBatch.Draw(this._texBtnSave, new Vector2(this._dstoado["btnSaveSetting"].X, this._dstoado["btnSaveSetting"].Y), Color.White);
            this._spriteBatch.Draw(this._texBtnSelectMusic, new Vector2(recMusic.X,recMusic.Y), Color.White);
            this._spriteBatch.Draw(this._texBtnSelectSound, new Vector2(recSound.X, recSound.Y), Color.White);
            this._spriteBatch.End();
        }

        #region Xử Lý Nghiệp Vụ
        /// <summary>
        /// Di chuyển thanh trượt và gán giá trị âm lượng  của music (nhạc nền) 
        /// </summary>
        private void DrapMoveMusic()
        {
            float volum = 0;
            if (CGLOBAL.MouseCurrent.X < CThamSo.posVLStart)
            {
                recMusic.X = CThamSo.posVLStart;
                volum = 0;
            }
            else if (CGLOBAL.MouseCurrent.X > CThamSo.posVLEnd)
            {
                recMusic.X = CThamSo.posVLEnd;
                volum = 1;
            }
            else
            {
                recMusic.X = CGLOBAL.MouseCurrent.X;
                volum = setPosAlMusic(volum);
            }

        }

        /// <summary>
        /// Set lại âm lượng khi trượt thanh âm lượng Music
        /// </summary>
        /// <param name="value">Giá trị âm lượng hiện tại</param>
        /// <returns>âm lượng Music khi đã set thành công</returns>
        public float setPosAlMusic(float value)
        {
            value = (recMusic.X - CThamSo.posVLStart) / CThamSo.posVLTich;
            CThamSo.volumMusic = value / 100f;
            return value;
        }

        /// <summary>
        /// Di chuyển thanh trượt và gán giá trị âm lượng của Sound (Âm thanh hiệu ưng)
        /// </summary>
        private void DrapMoveSound()
        {
            float volum = 0;
            if (CGLOBAL.MouseCurrent.X < CThamSo.posVLStart)
            {
                recSound.X = CThamSo.posVLStart;
                volum = 0;
            }
            else if (CGLOBAL.MouseCurrent.X > CThamSo.posVLEnd)
            {
                recSound.X = CThamSo.posVLEnd;
                volum = 1;
            }
            else
            {
                recSound.X = CGLOBAL.MouseCurrent.X;
                volum = setPosAlSound(volum);
            }

        }

        /// <summary>
        /// Set lại âm lượng khi trượt thanh âm lượng Sound
        /// </summary>
        /// <param name="value">Giá trị âm lượng hiện tại</param>
        /// <returns>âm lượng Sound khi đã set thành công</returns>
        public float setPosAlSound(float value)
        {
            value = (recSound.X - CThamSo.posVLStart) / CThamSo.posVLTich;
            CThamSo.volumSound = value / 100f;
            return value;
        }

        /// <summary>
        /// lấy giá trị âm lượng Sound và Di chuyển thanh trượt đến vị trí thích hợp
        /// </summary>
        /// <param name="value"> giá trị âm thanh cần truyền vào để gán vị trí </param>
        public void getPosALSound(float value)
        {
            recSound.X = CThamSo.posVLStart + (int)((value * 100) * 1.35);
        }

        /// <summary>
        /// lấy giá trị âm lượng Music và Di chuyển thanh trượt đến vị trí thích hợp
        /// </summary>
        /// <param name="value"> giá trị âm thanh cần truyền vào để gán vị trí </param>
        public void getPosALMusic(float value)
        {
            recMusic.X = CThamSo.posVLStart + (int)((value * 100) * 1.35);
        }

        #endregion
    }
}
